package main

import (
	"flag"
	"fmt"
	"os"

	"gitee.com/liumou_site/PasswordReset/cmd"
	"gitee.com/liumou_site/PasswordReset/config"
	"gitee.com/liumou_site/PasswordReset/service"
	"gitee.com/liumou_site/logger"
)

// 程序常量
const (
	ProgramName    = "PasswordReset"
	ProgramVersion = "v1.1.1"
	ProgramDesc    = "多平台系统密码重置工具"
)

// showHelp 显示程序帮助信息
func showHelp() {
	fmt.Printf("%s - %s %s\n", ProgramName, ProgramDesc, ProgramVersion)
	fmt.Println("")
	fmt.Println("使用方法:")
	fmt.Printf("  %s [选项]\n", ProgramName)
	fmt.Println("")
	fmt.Println("选项:")
	fmt.Println("  -add-user=用户名          添加用户(必须配合 -add-password 使用)")
	fmt.Println("  -add-password=密码后缀    添加用户时的密码后缀")
	fmt.Println("  -add                      立即创建不存在的系统用户(默认: false)")
	fmt.Println("                           与 -auto-create 区别: -add 立即生效，-auto-create 是配置属性")
	fmt.Println("  -auto-create              设置用户配置属性：当系统用户不存在时自动创建(默认: false)")
	fmt.Println("                           此设置保存在用户配置中，影响后续自动运行时的行为")
	fmt.Println("  -prefix                   密码前缀模式：使用日期作为前缀(默认: 后缀模式)")
	fmt.Println("  -remove-user=用户名       删除用户")
	fmt.Println("  -list-users               列出所有用户")
	fmt.Println("  -list-system-users        列出当前系统支持登录的用户")
	fmt.Println("  -print-service-cmd        打印当前系统的服务管理命令")
	fmt.Println("  -service-install           安装系统服务")
	fmt.Println("  -service-uninstall        卸载系统服务")
	fmt.Println("  -service-name=名称        设置服务名称(默认: PasswordReset)")
	fmt.Println("  -hour=数字                设置密码重置间隔时间(小时, 默认: 12)")
	fmt.Println("  -h, -help                 显示此帮助信息")
	fmt.Println("  -v, -version              显示版本信息")
	fmt.Println("")
	fmt.Println("参数区别说明:")
	fmt.Println("  -add vs -auto-create:")
	fmt.Println("    -add: 立即执行系统用户创建操作")
	fmt.Println("    -auto-create: 设置配置属性，影响后续自动运行时的行为")
	fmt.Println("")
	fmt.Println("示例:")
	fmt.Println("  # 立即创建系统用户")
	fmt.Println("  .\\PasswordReset.exe -add-user=admin -add-password=123456 -add")
	fmt.Println("")
	fmt.Println("  # 设置自动创建属性（不立即创建）")
	fmt.Println("  .\\PasswordReset.exe -add-user=admin -add-password=123456 -auto-create")
	fmt.Println("")
	fmt.Println("  # 同时设置两种属性")
	fmt.Println("  .\\PasswordReset.exe -add-user=admin -add-password=123456 -add -auto-create")
	fmt.Println("")
	fmt.Println("  # 列出所有用户")
	fmt.Println("  .\\PasswordReset.exe -list-users")
	fmt.Println("")
	fmt.Println("  # 安装服务，每6小时重置一次密码")
	fmt.Println("  .\\PasswordReset.exe -service-install -hour=6")
}

// showVersion 显示程序版本信息
func showVersion() {
	fmt.Printf("%s %s\n", ProgramName, ProgramVersion)
	fmt.Println("")
	fmt.Println("一个跨平台的系统密码重置工具")
	fmt.Println("支持多平台系统的用户密码自动重置")
	fmt.Println("")
	fmt.Println("项目地址: https://gitee.com/liumou_site/PasswordReset")
	fmt.Println("作者: 坐公交也用券")
	fmt.Println("")
}

// main函数是程序的入口点
func main() {
	// 定义命令行参数
	addUser := flag.String("add-user", "", "添加用户(用户名)")
	addPassword := flag.String("add-password", "", "设置用户的密码固定组成值")
	addUserCreate := flag.Bool("add", false, "创建不存在的系统用户(默认: false)")
	autoCreate := flag.Bool("auto-create", false, "自动创建系统用户(默认: false)")
	prefixMode := flag.Bool("prefix", false, "密码前缀模式：使用日期作为前缀(默认: 后缀模式)")
	removeUser := flag.String("remove-user", "", "删除用户(用户名)")
	listUsers := flag.Bool("list-users", false, "列出所有用户")
	listSystemUsers := flag.Bool("list-system-users", false, "列出当前系统支持登录的用户")
	printServiceCmd := flag.Bool("print-service-cmd", false, "打印当前系统的服务管理命令")
	serviceInstall := flag.Bool("service-install", false, "安装系统服务")
	serviceUninstall := flag.Bool("service-uninstall", false, "卸载系统服务")
	serviceName := flag.String("service-name", "PasswordReset", "设置服务名称(默认: PasswordReset)")
	hour := flag.Int("hour", 12, "设置密码重置间隔时间(小时)")

	// 如果没有任何参数，直接显示帮助并返回
	if len(os.Args) == 1 {
		showHelp()
		return
	}

	// 自定义处理帮助与版本参数，避免与 -h 冲突
	for _, arg := range os.Args[1:] {
		switch arg {
		case "-h", "--help", "-help", "help":
			showHelp()
			return
		case "-v", "--version", "-version", "version":
			showVersion()
			return
		}
	}

	// 解析其余命令行标志
	flag.Parse()

	// 检查系统要求
	if !cmd.CheckSystemRequirements() {
		os.Exit(1)
	}

	// 处理添加用户命令
	if *addUser != "" || *addPassword != "" {
		if *addUser == "" || *addPassword == "" {
			logger.Error("添加用户需要同时指定用户名和密码")
			logger.Error("使用示例: -add-user=用户名 -add-password=密码后缀")
			logger.Error("可选参数: -add (创建不存在的系统用户)")
			os.Exit(1)
		}

		if err := cmd.AddUser(*addUser, *addPassword, *addUserCreate, *autoCreate, *prefixMode); err != nil {
			logger.Error("添加用户失败: %v", err)
			os.Exit(1)
		}
		return
	}

	// 处理删除用户命令
	if *removeUser != "" {
		if err := cmd.RemoveUser(*removeUser); err != nil {
			logger.Error("删除用户失败: %v", err)
			os.Exit(1)
		}
		return
	}

	// 处理列出用户命令
	if *listUsers {
		if err := cmd.ListUsers(); err != nil {
			logger.Error("列出用户失败: %v", err)
			os.Exit(1)
		}
		return
	}

	// 处理列出系统用户命令
	if *listSystemUsers {
		if err := cmd.ListSystemUsers(); err != nil {
			logger.Error("列出系统用户失败: %v", err)
			os.Exit(1)
		}
		return
	}

	// 处理打印服务管理命令
	if *printServiceCmd {
		service.PrintServiceManagementCommands(*serviceName)
		return
	}

	// 处理服务安装
	if *serviceInstall {
		if err := service.InstallService(*serviceName, *hour); err != nil {
			logger.Error("安装服务失败: %v", err)
			os.Exit(1)
		}
		return
	}

	// 处理服务卸载
	if *serviceUninstall {
		if err := service.UninstallService(*serviceName); err != nil {
			logger.Error("卸载服务失败: %v", err)
			os.Exit(1)
		}
		return
	}

	// 设置运行环境
	if err := cmd.SetupEnvironment(); err != nil {
		logger.Error("环境设置失败: %v", err)
		os.Exit(1)
	}

	// 初始化安全密钥管理器
	keyManager := config.NewSecureKeyManager()
	if err := keyManager.Initialize(); err != nil {
		logger.Error("初始化密钥管理器失败: %v", err)
		os.Exit(1)
	}

	// 获取主密钥
	key, err := keyManager.GetMasterKey()
	if err != nil {
		logger.Error("获取加密密钥失败: %v", err)
		os.Exit(1)
	}

	users, err := config.LoadAllUserConfigs(key)
	if err != nil {
		logger.Error("加载用户配置失败: %v", err)
		os.Exit(1)
	}
	if len(users) == 0 {
		logger.Error("系统首次运行，尚未配置用户")
		logger.Error("请使用以下命令添加用户:")
		logger.Error("  Windows: .\\PasswordReset.exe -add-user=用户名 -add-password=密码后缀")
		logger.Error("  Linux:   ./PasswordReset -add-user=用户名 -add-password=密码后缀")
		logger.Error("示例: -add-user=admin -add-password=123456")
		logger.Error("")
		logger.Error("其他可用命令:")
		logger.Error("  -list-users              列出所有用户")
		logger.Error("  -list-system-users       列出当前系统支持登录的用户")
		logger.Error("  -remove-user=用户名      删除用户")
		logger.Error("  -print-service-cmd       查看服务管理命令")
		logger.Error("  -h 数字                  设置密码重置间隔(小时)")
		os.Exit(1)
	}

	// 启动服务
	runner := service.NewRunner(*hour)
	runner.Start(*serviceName)
}
